package com.adisi.bd;

import java.math.BigDecimal;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;


import com.adisi.objetos.Domicilio;
import com.adisi.objetos.EstadoViaje;
import com.adisi.objetos.Jornada;
import com.adisi.objetos.Viaje;

public class ViajeDatos {

	private Coneccion coneccion;
	
	public ViajeDatos() {
		super();
		
		coneccion = new Coneccion();
	}
	
	public ViajeDatos(Coneccion coneccion) {
		super();
		
		this.coneccion = coneccion;
	}
	
	public int grabarUnViaje(Viaje viaje) throws Exception 	{
			
			Connection con = null;
			
			CallableStatement sp = null;

			int id = 0;
			
			try {
				con = coneccion.conectar();
				
				if (viaje.getIdViaje()==0)
				{
				
					sp = con.prepareCall("{? = call sp_Viaje_Insert(?,?,?,?,?,?,?,?,?)}");
					
					sp.registerOutParameter(1, java.sql.Types.INTEGER);
					
					sp.setInt("id_jornada", viaje.getJornada().getId());
					sp.setInt("id_cliente", viaje.getCliente().getIdCliente());
					sp.setString("direccion_origen", viaje.getOrigen().toString());
					sp.setString("direccion_destino", viaje.getDestino().toString());
					sp.setDate("fecha_hora_inicio", new java.sql.Date( viaje.getFechaHoraInicio().getTime()));
					sp.setDate("fecha_hora_fin", new java.sql.Date( viaje.getFechaHoraFin()!=null?viaje.getFechaHoraFin().getTime():0));
					sp.setString("estado", viaje.getEstado().toString());
					sp.setBigDecimal("costo", BigDecimal.ZERO);
					sp.setBigDecimal("comision", BigDecimal.ZERO);
								
					sp.execute();  
					
					id = sp.getInt(1);
				}
				else
				{
					sp = con.prepareCall("{call sp_Viaje_Update(?,?,?,?,?,?,?,?,?,?)}");
					
					sp.setInt("id_viaje", viaje.getIdViaje());
					sp.setInt("id_jornada", viaje.getJornada().getId());
					sp.setInt("id_cliente", viaje.getCliente().getIdCliente());
					sp.setString("direccion_origen", viaje.getOrigen().toString());
					sp.setString("direccion_destino", viaje.getDestino().toString());
					sp.setDate("fecha_hora_inicio", new java.sql.Date( viaje.getFechaHoraInicio().getTime()));
					sp.setDate("fecha_hora_fin", new java.sql.Date( viaje.getFechaHoraFin()!=null?viaje.getFechaHoraFin().getTime():0));
					sp.setString("estado", viaje.getEstado().toString());
					sp.setBigDecimal("costo", viaje.getCosto());
					sp.setBigDecimal("comision", viaje.getComision()); 
								
					sp.execute();  
					
					id = viaje.getIdViaje();
					
				}
								
			} catch (SQLException e) {
				throw e;
			} catch (Exception e) {
				throw e;	
			} finally {
				
				try {
					sp.close();
					con.close();
				} catch (SQLException e) {
					System.out.println("problema al cerrar");
				}
			}
			
			return id;

	}
	
	public Viaje conseguirUnViaje(int idViaje) throws Exception {
		Viaje viaje = null;
		Connection con = null;
		Coneccion coneccion = new Coneccion();
		ResultSet rs = null;
		
		CallableStatement sp = null;
		
		ClienteDatos cd = new ClienteDatos();
		JornadaDatos jd = new JornadaDatos();
		
		try {
			con = coneccion.conectar();
			
			sp = con.prepareCall("{call sp_Viaje_Select_x_Id(?)}");
			
			sp.setInt("id_viaje", idViaje);
			
			sp.execute();
			
			rs = sp.getResultSet();
			while (rs.next()) {
				
				viaje = new Viaje(
							idViaje,
							jd.conseguirUnaJornada(rs.getInt("id_jornada")),
							cd.conseguirUnCliente(rs.getInt("id_cliente")),
							new Domicilio(rs.getString("direccion_origen")),
							new Domicilio(rs.getString("direccion_destino")),
							rs.getDate("fecha_hora_inicio"),
							rs.getDate("fecha_hora_fin"),
							EstadoViaje.valueOf(rs.getString("estado"))
						);
			}
		} catch (SQLException e) {
			throw e;
		} catch (Exception e) {
			throw e;			
		} finally {
			try {
				rs.close();
				sp.close();
				con.close();
			} catch (SQLException e) {
				throw e;
			}
		}
		return viaje;		
	}

	public Viaje conseguirUnViaje(String imei) throws Exception	{
		Viaje viaje = null;
		Connection con = null;
		
		ResultSet rs = null;
		
		CallableStatement sp = null;
		
		ClienteDatos cd = new ClienteDatos();
		JornadaDatos jd = new JornadaDatos();
		
		try {
			con = coneccion.conectar();
			
			sp = con.prepareCall("{call sp_Viaje_Select_x_IMEI(?)}");
			
			sp.setString("imei", imei);
			
			sp.execute();
			
			rs = sp.getResultSet();
			while (rs.next()) {
				
				viaje = new Viaje(
							rs.getInt("id_viaje"),
							jd.conseguirUnaJornada(rs.getInt("id_jornada")),
							cd.conseguirUnCliente(rs.getInt("id_cliente")),
							new Domicilio(rs.getString("direccion_origen")),
							new Domicilio(rs.getString("direccion_destino")),
							rs.getDate("fecha_hora_inicio"),
							rs.getDate("fecha_hora_fin"),
							EstadoViaje.valueOf(rs.getString("estado"))
						);
			}
		} catch (SQLException e) {
			
			
		} catch (Exception e) {
			throw e;			
		} finally {
			try {
				rs.close();
				sp.close();
				con.close();
			} catch (SQLException e) {
				throw e;
			}
		}
		return viaje;		
	}

	public ArrayList<Viaje> conseguirTodosLosViajes(Jornada jornada) throws Exception {
		
		ArrayList<Viaje> viajes = new ArrayList<Viaje>();
		Connection con = null;
		
		ResultSet rs = null;
		
		CallableStatement sp = null;
		
		ClienteDatos cd = new ClienteDatos();
		
		try {
			con = coneccion.conectar();
			
			sp = con.prepareCall("{call sp_Viaje_Select_x_Jornada(?)}");
			
			sp.setInt("id_jornada", jornada.getId());
			
			sp.execute();
			
			rs = sp.getResultSet();
			while (rs.next()) {
				
				Viaje viaje = new Viaje(
							rs.getInt("id_viaje"),
							jornada,
							cd.conseguirUnCliente(rs.getInt("id_cliente")),
							new Domicilio(rs.getString("direccion_origen")),
							new Domicilio(rs.getString("direccion_destino")),
							rs.getDate("fecha_hora_inicio"),
							rs.getDate("fecha_hora_fin"),
							EstadoViaje.valueOf(rs.getString("estado"))
						);
				viajes.add(viaje);
				
			}
		} catch (SQLException e) {
			throw e;
		} catch (Exception e) {
			throw e;			
		} finally {
			try {
				rs.close();
				sp.close();
				con.close();
			} catch (SQLException e) {
				throw e;
			}
		}
		return viajes;		
	}
	
}
